bitkeeper revision 1.1200 (42107fffsY27L01xietRjdMzGHiDzw)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 14 Feb 2005 10:39:59 +0000 (10:39 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 14 Feb 2005 10:39:59 +0000 (10:39 +0000)
x86/64 build fixes and simpler debug tracing.
Signed-off-by: keir.fraser@cl.cam.ac.uk
xen/arch/x86/domain.c
xen/arch/x86/shadow.c
xen/arch/x86/x86_64/domain_build.c
xen/common/keyhandler.c
xen/drivers/char/console.c
xen/include/asm-x86/config.h
xen/include/xen/console.h
xen/include/xen/lib.h
xen/include/xen/serial.h

index dd496ee31a04d861b4cd564d8cc09efb85d1508f..7e9b9bd7632c42b73a830a5f737d0bce2a42858b 100644 (file)
@@ -658,7 +658,7 @@ static void switch_segments(
         {
             n->arch.flags |= TF_kernel_mode;
             __asm__ __volatile__ ( "swapgs" );
-            update_pagetables(ed);
+            update_pagetables(n);
             write_ptbase(n);
         }
 
index d676317843e96a38ce058f9c9a2bab0ee55b7f95..776c7a5363f18bb14d0dbd0a6783f36c314491f9 100644 (file)
@@ -469,7 +469,6 @@ unsigned long shadow_l2_table(
 {
     struct pfn_info *spfn_info;
     unsigned long    spfn;
-    l2_pgentry_t    *spl2e = 0;
     unsigned long guest_gpfn;
 
     guest_gpfn = __mfn_to_gpfn(d, gpfn);
@@ -500,6 +499,7 @@ unsigned long shadow_l2_table(
     }
     else
     {
+        l2_pgentry_t *spl2e;
         spl2e = (l2_pgentry_t *)map_domain_mem(spfn << PAGE_SHIFT);
         /*
          * We could proactively fill in PDEs for pages that are already
index 1ae5604a1a31ea1a51bcc4cd0fad9caa910fcff1..a6001885a13ab59566cad9cdb964f088cca9554f 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/system.h>
 #include <asm/io.h>
 #include <asm/processor.h>
+#include <asm/shadow.h>
 #include <asm/desc.h>
 #include <asm/i387.h>
 #include <xen/event.h>
@@ -328,8 +329,8 @@ int construct_dom0(struct domain *d,
         d->shared_info->vcpu_data[i].evtchn_upcall_mask = 1;
     d->shared_info->n_vcpu = smp_num_cpus;
 
-    /* setup shadow and monitor tables */
-    update_pagetable(ed);
+    /* Set up shadow and monitor tables. */
+    update_pagetables(ed);
 
     /* Install the new page tables. */
     __cli();
index 14859a0a91392e296a3ed274e4d03484b3bce44e..5ab94600e7bce42c5d2bb6a92dff929b77fe9630 100644 (file)
@@ -75,14 +75,12 @@ void register_irq_keyhandler(
 static void show_handlers(unsigned char key)
 {
     int i; 
-    int buffer_enable = sercon_buffer_bypass();
     printk("'%c' pressed -> showing installed handlers\n", key);
     for ( i = 0; i < KEY_MAX; i++ ) 
         if ( key_table[i].u.handler != NULL ) 
             printk(" key '%c' (ascii '%02x') => %s\n", 
                    (i<33 || i>126)?(' '):(i),i,
                    key_table[i].desc);
-    sercon_buffer_set(buffer_enable);
 }
 
 static void dump_registers(unsigned char key, struct xen_regs *regs)
@@ -179,10 +177,6 @@ void initialize_keytable(void)
 #ifndef NDEBUG
     register_keyhandler(
         'o', audit_domains_key,  "audit domains >0 EXPERIMENTAL"); 
-
-    register_keyhandler(
-        'c', sercon_buffer_toggle,
-        "toggle serial console output vs ring buffer capture");
 #endif
 
 #ifdef PERF_COUNTERS
@@ -191,5 +185,6 @@ void initialize_keytable(void)
     register_keyhandler(
         'P', perfc_reset,    "reset performance counters"); 
 #endif
+
     register_irq_keyhandler('%', do_debug_key,   "Trap to xendbg");
 }
index 366b43bb8cf19ac2202b88d24d2a328d9606b8d4..00f2223f7775e26bfc79de33b4e6e70965204e75 100644 (file)
@@ -51,18 +51,6 @@ static int vgacon_enabled = 0;
 
 spinlock_t console_lock = SPIN_LOCK_UNLOCKED;
 
-#ifndef NDEBUG
-static unsigned char *sercon_buffer      = NULL;
-static unsigned char *sercon_buffer_end  = NULL;
-static unsigned char *sercon_buffer_head = NULL;
-static unsigned char *sercon_buffer_next = NULL;
-
-static unsigned int opt_sercon_buffer_size = 128; /* kbytes */
-integer_param("conbuf", opt_sercon_buffer_size);
-
-static void sercon_buffer_puts(const unsigned char *s);
-#endif
-
 /*
  * *******************************************************
  * *************** OUTPUT TO VGA CONSOLE *****************
@@ -266,11 +254,9 @@ static void switch_serial_input(void)
     xen_rx = !xen_rx;
     if ( SWITCH_CODE != 0 )
     {
-        int buffer_enable = sercon_buffer_bypass();
         printk("*** Serial input -> %s "
                "(type 'CTRL-%c' three times to switch input to %s).\n",
                input_str[xen_rx], opt_conswitch[0], input_str[!xen_rx]);
-        sercon_buffer_set(buffer_enable);
     }
 }
 
@@ -369,12 +355,7 @@ static inline void __putstr(const char *str)
 {
     int c;
 
-#ifndef NDEBUG
-    if ( sercon_handle & SERHND_BUFFERED )
-        sercon_buffer_puts(str);
-    else
-#endif
-        serial_puts(sercon_handle, str);
+    serial_puts(sercon_handle, str);
 
     while ( (c = *str++) != '\0' )
     {
@@ -485,133 +466,99 @@ void console_force_lock(void)
     spin_lock(&console_lock);
 }
 
-// 09Feb2005: this appears to be unused...
-void console_putc(char c)
-{
-    serial_putc(sercon_handle, c);
-}
-
-// 09Feb2005: this appears to be unused...
-int console_getc(void)
-{
-    return serial_getc(sercon_handle);
-}
-
-// 09Feb2005: this appears to be unused...
-int irq_console_getc(void)
-{
-    return irq_serial_getc(sercon_handle);
-}
 
 
 /*
  * **************************************************************
- * *************** serial console ring buffer *******************
+ * *************** Serial console ring buffer *******************
  * **************************************************************
  */
 
 #ifndef NDEBUG
-static void sercon_buffer_putc(const unsigned char c)
-{
-    if ( !sercon_buffer )
-        return;
-    if ( !c )
-        return;
 
-    if ( sercon_buffer_next == sercon_buffer_end )
-    {
-        // buffer wrap-around case...
-        sercon_buffer_head = sercon_buffer + 1;
-        sercon_buffer_next = sercon_buffer;
-    }
-    if ( sercon_buffer_head == sercon_buffer_next + 1 )
-    {
-        // the buffer is already full...
-        sercon_buffer_head++;
-    }
-    *sercon_buffer_next++ = c;
-    *sercon_buffer_next = 0;
-}
+static unsigned char *debugtrace_buf; /* Debug-trace buffer */
+static unsigned int   debugtrace_prd; /* Producer index     */
+static unsigned int   debugtrace_kilobytes = 128, debugtrace_bytes;
+integer_param("debugtrace", debugtrace_kilobytes);
+#define DEBUGTRACE_MASK(_p) ((_p) & (debugtrace_bytes-1))
 
-static void sercon_buffer_puts(const unsigned char *s)
+void debugtrace_reset(void)
 {
-    // inefficient but simple...
-    while ( *s )
-        sercon_buffer_putc(*s++);
+    if ( debugtrace_bytes != 0 )
+        memset(debugtrace_buf, '\0', debugtrace_bytes);
 }
 
-static void sercon_buffer_reset(void)
+void debugtrace_dump(void)
 {
-    sercon_buffer_head = sercon_buffer;
-    sercon_buffer_next = sercon_buffer;
-    sercon_buffer_head[0] = 0;
-}
+    int _watchdog_on = watchdog_on;
 
-static void sercon_buffer_flush(void)
-{
-    serial_puts(sercon_handle, sercon_buffer_head);
-    if ( sercon_buffer_head != sercon_buffer )
-        serial_puts(sercon_handle, sercon_buffer);
-    sercon_buffer_reset();
-}
+    if ( debugtrace_bytes == 0 )
+        return;
 
-void _sercon_buffer_dump(void)
-{
-    sercon_buffer_flush();
-    sercon_handle &= ~SERHND_BUFFERED;
+    /* Watchdog can trigger if we print a really large buffer. */
+    watchdog_on = 0;
+
+    /* Print oldest portion of the ring. */
+    serial_puts(sercon_handle,
+                &debugtrace_buf[DEBUGTRACE_MASK(debugtrace_prd)]);
+
+    /* Print youngest portion of the ring. */
+    debugtrace_buf[DEBUGTRACE_MASK(debugtrace_prd)] = '\0';
+    serial_puts(sercon_handle,
+                &debugtrace_buf[0]);
+
+    debugtrace_reset();
+
+    watchdog_on = _watchdog_on;
 }
 
-void sercon_buffer_toggle(unsigned char key)
+void debugtrace_printk(const char *fmt, ...)
 {
-    if ( !sercon_buffer )
-    {
-        printk("serial console buffer not allocated\n");
+    static spinlock_t _lock = SPIN_LOCK_UNLOCKED;
+    static char       buf[1024];
+
+    va_list       args;
+    unsigned char *p;
+    unsigned long  flags;
+
+    if ( debugtrace_bytes == 0 )
         return;
-    }
 
-    if ( sercon_handle & SERHND_BUFFERED )
-        sercon_buffer_flush();
-    sercon_handle ^= SERHND_BUFFERED;
-}
+    spin_lock_irqsave(&_lock, flags);
 
-void _sercon_buffer_set(int enable)
-{
-    if (enable)
-        sercon_handle |= SERHND_BUFFERED;
-    else
-        sercon_handle &= ~SERHND_BUFFERED;
-}
+    va_start(args, fmt);
+    (void)vsnprintf(buf, sizeof(buf), fmt, args);
+    va_end(args);        
 
-int _sercon_buffer_bypass(void)
-{
-    int buffering = !!(sercon_handle & SERHND_BUFFERED);
-    sercon_handle &= ~SERHND_BUFFERED;
+    for ( p = buf; *p != '\0'; p++ )
+        debugtrace_buf[DEBUGTRACE_MASK(debugtrace_prd++)] = *p;
 
-    return buffering;
+    spin_unlock_irqrestore(&_lock, flags);
 }
 
-static int __init sercon_buffer_init(void)
+static int __init debugtrace_init(void)
 {
     int order;
-    int kbytes = opt_sercon_buffer_size;
-
-    if ( !kbytes )
-        return 0;
+    unsigned int kbytes;
 
-    order = get_order(kbytes * 1024);
-    sercon_buffer = (void *)alloc_xenheap_pages(order);
-    ASSERT( sercon_buffer );
+    /* Round size down to next power of two. */
+    while ( (kbytes = (debugtrace_kilobytes & (debugtrace_kilobytes-1))) != 0 )
+        debugtrace_kilobytes = kbytes;
 
-    sercon_buffer_end = sercon_buffer + kbytes*1024 - 1;
-    *sercon_buffer_end = 0;
+    debugtrace_bytes = debugtrace_kilobytes << 10;
+    if ( debugtrace_bytes == 0 )
+        return 0;
 
-    sercon_buffer_reset();
+    order = get_order(debugtrace_bytes);
+    debugtrace_buf = (unsigned char *)alloc_xenheap_pages(order);
+    ASSERT(debugtrace_buf != NULL);
 
     return 0;
 }
-__initcall(sercon_buffer_init);
+__initcall(debugtrace_init);
+
+#endif /* !NDEBUG */
 
-#endif /* not NDEBUG */
 
 
 /*
@@ -647,8 +594,7 @@ void panic(const char *fmt, ...)
     __putstr("Reboot in five seconds...\n");
     spin_unlock_irqrestore(&console_lock, flags);
 
-    watchdog_on = 0;
-    sercon_buffer_dump();
+    debugtrace_dump();
 
     mdelay(5000);
     machine_restart(0);
index 4bba26a82619612a4c3cda78b74995e5ed8a4c9e..787d9536916797b8e5004a20d537883d4a1e598d 100644 (file)
@@ -99,19 +99,7 @@ extern void __out_of_line_bug(int line) __attribute__((noreturn));
 #define out_of_line_bug() __out_of_line_bug(__LINE__)
 #endif /* __ASSEMBLY__ */
 
-#ifndef __ASSEMBLY__
-#ifndef NDEBUG
-extern void _sercon_buffer_dump(void);
-#define sercon_buffer_dump() _sercon_buffer_dump()
-#else
-#define sercon_buffer_dump() ((void)0)
-#endif
-#define BUG() do {                                     \
-       printk("BUG at %s:%d\n", __FILE__, __LINE__);   \
-        watchdog_on = 0;                                \
-        sercon_buffer_dump();                           \
-} while (0)
-#endif /* __ASSEMBLY__ */
+#define FORCE_CRASH() __asm__ __volatile__ ( "ud2" )
 
 #if defined(__x86_64__)
 
index 7cc653595bd837f0e0a67e6ea84aa3a70139865b..024840c0addec83513bed6876bad1feb7bbdca68 100644 (file)
@@ -22,26 +22,4 @@ void console_endboot(int disable_vga);
 void console_force_unlock(void);
 void console_force_lock(void);
 
-void console_putc(char c);
-int console_getc(void);
-int irq_console_getc(void);
-
-#ifdef NDEBUG
-#define sercon_buffer_bypass() (0)
-#else
-#define sercon_buffer_bypass() _sercon_buffer_bypass()
-int _sercon_buffer_bypass(void);
-#endif
-
-#ifdef NDEBUG
-#define sercon_buffer_set(_enable) ((void)(0 && (_enable)));
-#else
-#define sercon_buffer_set(_enable) _sercon_buffer_set(_enable)
-void _sercon_buffer_set(int enable);
-#endif
-
-#ifndef NDEBUG
-void sercon_buffer_toggle(unsigned char key);
-#endif
-
 #endif /* __CONSOLE_H__ */
index 6ce764b7fc7be8cc70de83b069c8341781c2b163..4b274e197516b3492a6603240d53d3dfaf93c49a 100644 (file)
@@ -2,11 +2,18 @@
 #define __LIB_H__
 
 #include <stdarg.h>
+#include <xen/config.h>
 #include <xen/types.h>
 #include <xen/string.h>
 
+#define BUG() do {                                     \
+    printk("BUG at %s:%d\n", __FILE__, __LINE__);      \
+    debugtrace_dump();                                  \
+    FORCE_CRASH();                                      \
+} while ( 0 )
+
 #ifndef NDEBUG
-#define ASSERT(_p) if ( !(_p) ) { printk("Assertion '%s' failed, line %d, file %s\n", #_p , __LINE__, __FILE__); *(int*)0=0; }
+#define ASSERT(_p) if ( !(_p) ) { printk("Assertion '%s' failed, line %d, file %s\n", #_p , __LINE__, __FILE__); BUG(); }
 #else
 #define ASSERT(_p) ((void)0)
 #endif
@@ -20,6 +27,16 @@ struct domain;
 
 void cmdline_parse(char *cmdline);
 
+#ifndef NDEBUG
+extern void debugtrace_reset(void);
+extern void debugtrace_dump(void);
+extern void debugtrace_printk(const char *fmt, ...);
+#else
+#define debugtrace_reset()         ((void)0)
+#define debugtrace_dump()          ((void)0)
+#define debugtrace_printk(_f, ...) ((void)0)
+#endif
+
 #define printk printf
 void printf(const char *format, ...);
 void panic(const char *format, ...);
index 2a337145643ad94bdc6378dda78a102fa613b315..5c40db3e7d3dcc5e238621f48a566713fd78e92b 100644 (file)
@@ -18,7 +18,6 @@
 #define SERHND_HI       (1<<1) /* Mux/demux each transferred char by MSB. */
 #define SERHND_LO       (1<<2) /* Ditto, except that the MSB is cleared.  */
 #define SERHND_COOKED   (1<<3) /* Newline/carriage-return translation?    */
-#define SERHND_BUFFERED (1<<4) /* Console serial port ring buffered?      */
 
 /* Two-stage initialisation (before/after IRQ-subsystem initialisation). */
 void serial_init_stage1(void);